package com.at.bilibili.service.util;

import com.at.bilibili.domain.exception.ConditionException;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Calendar;
import java.util.Date;

public class TokenUtil {

    private static final String ISSUER = "李响";

    // TODO 使用JWT生成用户令牌
    public static String generateToken(Long userId) throws Exception {
        // 设置公钥私钥以及加密算法
        Algorithm algorithm = Algorithm.RSA256(RSAUtil.getPublicKey(), RSAUtil.getPrivateKey());
        // 设置过期时间
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.HOUR, 1);
        return JWT.create().withKeyId(String.valueOf(userId))
                // 设置签发者
                .withIssuer(ISSUER)
                // 设置过期时间
                .withExpiresAt(calendar.getTime())
                // 进行RSA加密
                .sign(algorithm);
    }
    // TODO 使用JWT进行用户令牌的验证
    public static Long verifyToken(String token) {
        // 指定之前加密使用的算法
        try {
            Algorithm algorithm = Algorithm.RSA256(RSAUtil.getPublicKey(), RSAUtil.getPrivateKey());
            // 创建验证对象
            JWTVerifier verifier = JWT.require(algorithm).build();
            // 进行验证
            DecodedJWT jwt = verifier.verify(token);
            String userId = jwt.getKeyId();
            return Long.valueOf(userId);
        } catch (TokenExpiredException e) {
            throw new ConditionException("555", "token过期！");
        } catch (Exception e){
            throw new ConditionException("非法用户token！");
        }
    }

    public static String generateRefreshToken(Long id) throws Exception {
        // 设置公钥私钥以及加密算法
        Algorithm algorithm = Algorithm.RSA256(RSAUtil.getPublicKey(), RSAUtil.getPrivateKey());
        // 设置过期时间
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.DAY_OF_MONTH, 7);
        return JWT.create().withKeyId(String.valueOf(id))
                // 设置签发者
                .withIssuer(ISSUER)
                // 设置过期时间
                .withExpiresAt(calendar.getTime())
                // 进行RSA加密
                .sign(algorithm);
    }
}
